home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 8
/
Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso
/
Aminet
/
mus
/
play
/
delay013.lha
/
dev
/
dev.doc
Wrap
Text File
|
1994-10-16
|
10KB
|
246 lines
Intro
=====
In this directory is located all the developers stuff. As you have probably
already realized, DeliAY can play several AY formats, using proper AY
Player. So, if you have written some ingenious tunes using your own
replayer routine, why not to give it a try and rewrite the player for
MC68000? Or perhaps send me the tunes and the Z80 source and let me see
what can be done?
If you decide to write your own AY Player, please check the Amadeus.S and
include40/misc/AYPlayer.i for more info about the DeliAY<->AYPlayer
interface. Also, before starting your work I strongly recommend to contact
me and to get the most recent info about this problematic available.
Contents
========
src/include40/misc/AYPlayer.i
Main includes, defines how each AY Player and AY Module has to
look like
src/include40/misc/mine.i
Just few asm support macros
src/Amadeus.S
This is the source of the ZXAYAMAD. This is the example, how
your own MC68000 rewrites could look like.
src/ZXAYEMUL.S
This is the source of a very special AY Player, which runs
original Z80 code. Just for your information.
src/emultest.s
Source of emul.test.
src/AYdebugger.S
Source of the AYdebugger. You can see how to write modules
with internal players (for special cases like this one there is
no need to have one special player and one special init module)
tests/AYdebugger
You can use this special standalone module to play with the AY
emulator. Just load it as any other module to DT2.
tests/emul.test
Load it to DT2 to see that ZXAYEMUL debug routine really works.
dev.doc
Obviously this file.
Converting
==========
So, let's assume that you have some marvellous tunes and want to listen to
them on your Amiga. What are your choices?
1) If you have several tunes, which you have written by yourself, using
some widespread music program, you have to check out if there is not
already some special player for that musical program. If not, or if you
have used your own player which were never distributed to the public, you
might decide to write your own AY Player. To do that, read AYPlayer.i to
see how every AY player interfaces with PlayAY. Also, you can check the
Amadeus.S how such player really looks like. Also note, that in addition to
standard AYMOD header, you will have to specify your own SONG header
structure... Also, you can read Amadeus.S how this might look like.
2) If you have ripped some tune, and you are sure that the same player is
not used with any other tune, it is üprobably not worth to rewrite it to
MC68000. In that case, you might want to use the special Emul Player, which
will emulate the original z80 replay routine with no need to rewrite it.
Typical Emul module looks like this:
incdir 'Include40/'
include misc/AYPlayer.i
incdir ''
b
AYMODHEADER EMUL
dc.w 0 ;no internal player
dc.w creator-*
dc.w misc-*
dc.b 3-1 ;how many songs
dc.b 0 ;which should start first
dc.w songdata-*
songdata dc.w name1-* ;use same name for all three songs.
dc.w data1-*
dc.w name1-*
dc.w data2-*
dc.w name1-*
dc.w data3-*
name1 dc.b 'Venom strikes back',0
creator dc.b 'Ben Daglish',0
misc dc.b 'Venom strikes back, (C) 19?? ????',0
even
data1 dc.b 0,1,2,3 ;channel assignement
dc.w 3*60*50 ;songlen
dc.w 50 ;fadelen
dc.w 0<<8 ;init number
dc.w launch-* ;launch structure
dc.w block-* ;block list
data2 dc.b 0,1,2,3
dc.w 9*50
dc.w 1
dc.w 1<<8
dc.w launch-*
dc.w block-*
data3 dc.b 0,1,2,3
dc.w 3*50
dc.w 1
dc.w 2<<8
dc.w launch-*
dc.w block-*
block dc.w 49152 ;put code at address
dc.w e-code ;len
dc.w code-* ;take code from
launch dc.w 0 ;stack / use as EMUL_Block list terminator
dc.w 0 ;init same as first block address
dc.w 49155 ;interrupt
code incbin 'asm:sources/fxs/other/venom.data'
e
For more info about how such module should look, read beginning of
ZXAYEMUL.S.
Few more words about emulation
==============================
It uses cut down version of my emulator I wrote some years ago. All
instructions are emulated, except those RES C,3,(IX+1) and similar (I was
just lazy, no other reason for this). All other like those with IY and IX
halfs + SLIA (AKA SLL) are implemented.
For every song you specify what stack, init number, INIT routine and
INTERRUPT routine emulator should use.
Init number is loaded to all registers (BC,DE,HL,BC',DE',HL',IX,IY + A and
A' which contain MSB) and stack obviously to SP.
All ROM is filled with 255 (because of that popular $FFFF IM 2 trick), all
RAM with 0. At address 0 this code is installed and executed.
call INIT ;whatever you passed in ems_init (or emd_address)
ld hl,INTERRUPT ;from ems_interrupt
ld a,h ;if no interrupt specified, we use the
or l ;im2 interrupt table to find it out
jr nz,ok
ld a,i
ld h,a
dec l
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
ok ld (here+1),hl
loop halt
here call ????
jr loop
Note that although address 0 contains $cd, address 65535+1 contains 243
(little emulator magic:-), so you can use that popular IM 2 setting which
jumps to 65535 executing JR 65524 there...
I didn't want to run the emulator from interrupts, IMHO it is too
dangerous, if the z80 code hangs. Also, too much serail transfer usually
occurs. So the solution is now like this:
Separate process is executed at priority 127. It runs the code described
above. Halt is implemented as waiting for an external signal. Meanwhile,
every interrupt EmulPlayer sends AY registers to the PlayAY, then sends
signal to the emulator process. So the process does not block any
interrupts even if it uses 100% of the CPU time.
So as you can see, no real interrupts are generated by the emulator, thus
DI/EI and IM x has no effect.
While playing already checked tunes this is not that important, but once
you start converting your own tunes, this may become more important:
imagine you execute some code which hangs the z80 (eg. jr $-2). It is not
that bad since we are not hanged as interrupt, but as normal task. Problem
is that the task has priority 127 and it takes all the time, so we can't
stop it from other tasks with different priority. Solution is simple:
ZXAYEMUL reads the binary variable z80debug and sets the priority according
to it. So before testing your own songs, you might want to type 'setenv
z80debug °' or something like that. The song will sound terrible whenever
you do some other activity (move a window or like), but it will never hang
your computer :-)
Other problem is what should the emulator do if it runs some invalid
instruction code. Solution: emulator process dumps all z80 registers and
some internal to the ram:z80debug and disappears. However, the RAM still
remains allocated until you drop the module, so you can simply see what
happened. To see how the debug routine works, try playing emul.test.
Emulation - advantages vs disadvantages
=======================================
Well, I realize that most people are simply too lazy to write their own AY
Player, especially when I have released the ZXAYEMUL, which makes
everything SOOOooo simple. However, they should realize following:
- Emulation is more CPU intensive. One should save his and others' time
and write MC68000 player.
- Emulation consumes much more memory - 64KB for RAM and about 21K for the
emulator plus one more process and stack.
- Frequencies are not fine tuned - simply ayfreq*8 is used. MC68000 players
use special pre-calculated table, so their output is more precise.
- Storing z80 code and data for every tune takes much more space than just
storing the data, which is done for MC68000 players.
So, the following should be taken as general rule:
Use ZXAYEMUL only for your "quickhacks" (when you plan to rewrite the
routine later to MC) to hear it. Also, use it, if there is only really few
tunes using this player (few means aprox. less than 5).
In all other cases you should decide to write MC68000 player.
Never use ZXAYEMUL for collections which have about 20 modules or more and
NEVER for musical programs. In such cases, MC68000 player should be ALWAYS
written.
OK, that's it. If you miss some information here, please refer to includes
and sources first, then try e-mailing me if you do not succeed.
Also, please send me all new tunes and new players. Thank You.
Patrik